﻿using System.Reflection;
using System.Text.Json;

namespace MiddlewareTestWebApp
{
    public class BindingHelper
    {
        /// <summary>
        /// httpContext 参数为请求的HttpContext对象，actionMethod参数为请求的Action方法
        /// 返回值是解析出来的操作方法的参数值
        /// 我们约定操作方法只能有一个参数，如果参数是HttpContext类型，则直接将GetParameterValues方法的第一个参数传入
        /// </summary>
        /// <param name="httpContext"></param>
        /// <param name="actionMethod"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public static object?[] GetParameterValues(HttpContext httpContext,MethodInfo actionMethod)
        {
            var parameters = actionMethod.GetParameters();
            if (parameters.Length <= 0)
            {
                return new object?[0];
            }
            else if (parameters.Length > 1)
            {
                throw new Exception("Action参数只能为0个或1个");
            }

            // 以下是 parameters.Length==1,只有一个参数的情况
            if(parameters.Single().ParameterType == typeof(HttpContext))
            {
                return new object?[] { httpContext };
            }
            // 其他类型的参数都从请求报文体中获取
            if(!httpContext.Request.HasJsonContentType())
            {
                throw new Exception("Action如果只有一个参数，则contentType必须是application/json,请求报文体不是json格式");
            }
            // 如果报文体是空，则绑定参数值为null
            if(httpContext.Request.ContentLength == 0)
            {
                return new object?[] { null };
            }
            var reqStream = httpContext.Request.BodyReader.AsStream();
            Type paramType = parameters.Single().ParameterType;
            object? paramValue = JsonSerializer.Deserialize(reqStream, paramType);
            return new object?[1] { paramValue };
        }
    }
}
